package com.wusiwei.service;

import com.wusiwei.entity.Receipt;
import com.wusiwei.vo.ReceiptStatistics;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 收货单服务接口
 */
public interface ReceiptService {

    /**
     * 获取所有收货单
     *
     * @return 收货单列表
     */
    List<Receipt> getAllReceipts();

    /**
     * 根据ID获取收货单
     *
     * @param id 收货单ID
     * @return 收货单信息
     */
    Receipt getReceiptById(Long id);

    /**
     * 根据订单ID获取关联收货单
     *
     * @param orderId 订单ID
     * @return 收货单列表
     */
    List<Receipt> getReceiptsByOrderId(Long orderId);

    /**
     * 创建收货单
     *
     * @param receipt 收货单信息
     * @return 创建的收货单
     */
    Receipt createReceipt(Receipt receipt);

    /**
     * 更新收货单
     *
     * @param id      收货单ID
     * @param receipt 更新的收货单信息
     * @return 更新后的收货单
     */
    Receipt updateReceipt(Long id, Receipt receipt);

    /**
     * 删除收货单
     *
     * @param id 收货单ID
     * @return 是否删除成功
     */
    boolean deleteReceipt(Long id);

    /**
     * 批量删除收货单
     *
     * @param ids 收货单ID列表
     * @return 是否删除成功
     */
    boolean batchDeleteReceipt(List<Long> ids);

    /**
     * 收货单验收
     *
     * @param id     收货单ID
     * @param status 验收状态
     * @return 更新后的收货单
     */
    Receipt acceptReceipt(Long id, String status);

    /**
     * 分页查询收货单
     *
     * @param pageNum       页码
     * @param pageSize      每页大小
     * @param receiptNumber 收货单号
     * @param supplierName  供应商名称
     * @param status        状态
     * @param startDate     开始日期
     * @param endDate       结束日期
     * @param receiptDate   收货日期
     * @return 收货单分页结果
     */
    Object getReceiptPage(int pageNum, int pageSize, String receiptNumber,
                          String supplierName, String status,
                          String startDate, String endDate, String receiptDate);

    /**
     * 获取收货单状态统计
     *
     * @return 收货单状态统计
     */
    ReceiptStatistics getReceiptStatusStatistics();

    /**
     * 导出收货单
     *
     * @param receiptNumber 收货单号
     * @param supplierName  供应商名称
     * @param status        状态
     * @param startDate     开始日期
     * @param endDate       结束日期
     * @return 导出的文件数据
     */
    byte[] exportReceipts(String receiptNumber, String supplierName,
                          String status, String startDate, String endDate);

    /**
     * 获取收货单总金额
     *
     * @return 收货单总金额
     */
    BigDecimal getTotalReceiptAmount();

    /**
     * 获取按供应商统计的收货单数据
     *
     * @param limit 限制返回的供应商数量
     * @return 按供应商统计的收货单数据
     */
    List<Map<String, Object>> getReceiptStatsBySupplier(int limit);

    /**
     * 获取当月收货单数量
     *
     * @return 当月收货单数量
     */
    int getCurrentMonthReceiptCount();

    /**
     * 获取当月收货单金额
     *
     * @return 当月收货单金额
     */
    BigDecimal getCurrentMonthReceiptAmount();

    /**
     * 获取指定年份的月度收货单趋势数据
     *
     * @param year 年份
     * @return 月度趋势数据
     */
    List<Map<String, Object>> getMonthlyReceiptTrend(int year);

//    /**
//     * 查询各月份收货单总额
//     *
//     * @param startDate 开始日期
//     * @param endDate   结束日期
//     * @return 统计结果
//     */
//    List<Map<String, Object>> sumAmountGroupByMonth(LocalDate startDate, LocalDate endDate);

    /**
     * 根据供应商和金额范围查询收货单
     *
     * @param supplierName 供应商名称
     * @param targetAmount 目标金额
     * @param minAmount    最小金额
     * @param maxAmount    最大金额
     * @return 符合条件的收货单列表
     */
    List<Receipt> findBySupplierAndAmount(String supplierName, BigDecimal targetAmount,
                                          BigDecimal minAmount, BigDecimal maxAmount);

    /**
     * 根据近似供应商名称和金额范围查询收货单
     * 使用模糊匹配查询供应商名称相似的收货单
     *
     * @param supplierName 供应商名称
     * @param targetAmount 目标金额
     * @param minAmount    最小金额
     * @param maxAmount    最大金额
     * @return 符合条件的收货单列表
     */
    List<Receipt> findBySimilarSupplierAndAmount(String supplierName, BigDecimal targetAmount,
                                                 BigDecimal minAmount, BigDecimal maxAmount);

    /**
     * 根据收货单号查询收货单
     *
     * @param receiptNumber 收货单号
     * @return 收货单信息
     */
    Receipt findByReceiptNumber(String receiptNumber);

    /**
     * 根据订单编号查询收货单
     *
     * @param orderNumber 订单编号
     * @return 收货单列表
     */
    List<Receipt> findByOrderNumber(String orderNumber);
} 